package com.ruoyi.custom.utils;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.fill.Column;
import org.apache.commons.lang3.StringUtils;

import java.sql.Types;
import java.util.Collections;

/**
 * 代码生成器
 */
public class MyGenerateUtils {
    private static String outputDir = "D:\\DevelopSpace\\MyWorkSpace\\OutPutDir\\ruoyi-vue";
    //自动填充字段
    private static Column[] fillColumns = new Column[]{
            new Column("f_updated_time", FieldFill.INSERT_UPDATE),
            new Column("f_created_time", FieldFill.INSERT),
            new Column("created_by", FieldFill.INSERT),
            new Column("updated_by", FieldFill.INSERT_UPDATE),
            new Column("f_delete_flag", FieldFill.INSERT),
            new Column("f_status", FieldFill.INSERT),
    };

    // 设置父包名
    static String parent = "com.ruoyi";
    // 表前缀
    static String[] tablePrefix = {"t_", "t_cmttg_"};
    // 字段前缀
    static String[] fieldPrefix = {"f_"};
    // 设置作者
    private static String author = "xudm";
    //数据库连接信息
    private static String url = "jdbc:mysql://127.0.0.1:3306/ry-vue?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8";
    //数据库连接信息
    private static String username = "root";
    //数据库连接信息
    private static String password = "xudm123456";

    public static void main(String[] args) {
        generatorByBusinessModule("custom", "encryption", new String[]{"encrypt_envconfig"});
    }

    public static void generatorByBusinessModule(String projectName, String businessModuleName, String[] generatorTables) {
        String convertName = StringUtils.isBlank(businessModuleName) ? businessModuleName : "." + businessModuleName;
        //设置 entity 包名
        String entityPackageName = projectName + ".domain" + convertName;
        //设置 controller 包名
        String controllerPackageName = projectName + ".controller";
        //设置 service 包名
        String servicePackageName = projectName + ".service" + convertName;
        //设置 serviceImpl 包名
        String serviceImplPackageName = projectName + ".service.Impl" + convertName;
        //设置 mapper 包名
        String mapperPackageName = projectName + ".mapper" + convertName;

        // 设置mapperXml生成路径
        String mapperXmlPath = outputDir + "/mapper/" + businessModuleName;

        // 设置 service 父类
        String superServiceName = "com.baomidou.mybatisplus.extension.service.IService";
        // 设置 serviceImpl 父类
        String superServiceImplName = "com.baomidou.mybatisplus.extension.service.impl.ServiceImpl";

        FastAutoGenerator.create(url, username, password)
                //全局配置
                .globalConfig(builder -> {
                    builder.author(author)// 设置作者名
                            .outputDir(outputDir) // 设置输出目录
//                            .enableSwagger() // 开启 Swagger 模式
                            .dateType(DateType.ONLY_DATE) // 设置时间类型策略
                            .commentDate("yyyy-MM-dd") // 设置注释日期格式
                            .build();
                })
                .dataSourceConfig(builder -> builder.typeConvertHandler((configBuilder, fieldType, metaInfo) -> {
                    int typeCode = metaInfo.getJdbcType().TYPE_CODE;
                    if (typeCode == Types.SMALLINT) {
                        // 自定义类型转换
                        return DbColumnType.INTEGER;
                    }
                    if (typeCode == Types.BIGINT) {
                        return DbColumnType.STRING;
                    }
                    if (typeCode == Types.TINYINT) {
                        return DbColumnType.INTEGER;
                    }
                    return fieldType.getColumnType(metaInfo);
                }))
                //包配置
                .packageConfig(builder -> {
                    builder.parent(parent) // 设置父包名
                            .entity(entityPackageName) // 设置实体包名
                            .controller(controllerPackageName) // 设置控制器包名
                            .service(servicePackageName) // 设置服务包名
                            .serviceImpl(serviceImplPackageName) // 设置服务实现包名
                            .mapper(mapperPackageName) // 设置 Mapper 包名
                            .pathInfo(Collections.singletonMap(OutputFile.xml, mapperXmlPath)); // 设置mapperXml生成路径
                })
                //策略配置
                .strategyConfig(builder -> {
                    builder.addInclude(generatorTables) // 设置需要生成的表名
                            .addTablePrefix(tablePrefix) // 设置表前缀
                            .addFieldPrefix(fieldPrefix); // 设置字段前缀

                    builder.entityBuilder() // 实体类配置
                            .enableFileOverride() // 开启文件覆盖
                            .enableColumnConstant() // 开启字段常量
                            .addTableFills(fillColumns) // 设置字段填充
                            .idType(IdType.ASSIGN_ID) // 主键类型，生成策略
                            .enableLombok() // 开启 Lombok 模式
                            .enableChainModel() // 开启链式调用
                            .enableActiveRecord() // 开启 ActiveRecord 模式
                            .enableTableFieldAnnotation() // 开启字段注解
                            .logicDeletePropertyName("delFlag") // 设置逻辑删除字段名
                            .disableSerialVersionUID();// 禁用 serialVersionUID
//                            .javaTemplate("entity1.java");// 设置实体类模板

                    builder.controllerBuilder() // 控制器配置
                            .enableRestStyle() // 开启 REST 风格
                            .enableFileOverride() // 开启文件覆盖
                            .enableHyphenStyle();// 开启驼峰转连字符

                    builder.serviceBuilder() // 服务配置
                            .enableFileOverride() // 开启文件覆盖
                            .superServiceClass(superServiceName) // 设置服务类父类
                            .superServiceImplClass(superServiceImplName); // 设置服务实现类父类

                    builder.mapperBuilder() // Mapper 配置
                            .enableBaseColumnList()// 开启 BaseColumnList
                            .enableBaseResultMap()// 开启 BaseResultMap
                            .enableFileOverride();// 开启文件覆盖
                }).execute();
    }
}
